// 定义一个 Shader，它的路径（在 Unity Shader 下拉菜单中显示的路径）是 "Graph/Point Surface"
Shader "Graph/Point Surface" 
{
    // ======================
    // Properties（属性块）
    // 定义可以在 Unity Inspector 中调节的参数
    // ======================
    Properties 
    {
        // _Smoothness：控制材质的光滑度（反射模糊程度），常用于 PBR 材质中
        // 范围是 0 ~ 1，默认值为 0.5，可在 Inspector 中用滑块调节
        _Smoothness ("Smoothness", Range(0,1)) = 0.5
    }

    // ======================
    // SubShader（子着色器）
    // Unity 会从上到下查找第一个能运行的 SubShader
    // 一个 Shader 可以包含多个 SubShader，分别适配不同 GPU 等级
    // ======================
    SubShader 
    {
        // ============================================
        // CGPROGRAM ... ENDCG：标记 Shader 的核心代码块，使用 CG/HLSL 编写
        // 使用的是 Surface Shader 语法
        // ============================================
        CGPROGRAM

        // ===========================
        // 表面着色器编译指令
        // ===========================

        // #pragma surface ...：声明这是一个 Surface Shader
        // 参数说明：
        // - "ConfigureSurface"：是我们自己定义的 表面配置函数 的名称
        // - "Standard"：表示使用 Unity 的 Standard（PBR）光照模型
        // - "fullforwardshadows"：启用完整的前向渲染阴影支持
        #pragma surface ConfigureSurface Standard fullforwardshadows

        // 指定该 Shader 编译目标为 Shader Model 3.0，兼容多数设备
        #pragma target 3.0

        // ===========================
        // 输入结构体（Input）
        // 定义了传递给表面着色器函数的一些数据
        // ===========================

        // Input 是一个自定义的结构，用于传入表面函数的额外数据
        struct Input 
        {
            // worldPos：当前片段（像素）所在的世界空间坐标
            // 这个变量名是固定的约定，Surface Shader 会自动填充该值
            float3 worldPos;
        };

        // ===========================
        // 自定义属性变量（从 Properties 中传入的参数）
        // ===========================

        // _Smoothness：从 Inspector 中传入的光滑度参数
        float _Smoothness;

        // ===========================
        // 表面着色器主函数：ConfigureSurface
        // 功能：设置材质的基础颜色（Albedo）和光滑度（Smoothness）
        // ===========================

        void ConfigureSurface (Input input, inout SurfaceOutputStandard surface) 
        {
            // surface.Albedo：材质的基础颜色（RGB，漫反射颜色）

            // input.worldPos * 0.5 + 0.5：
            // 这是一个常见的技巧，用于将世界坐标从范围 [-n, n] 映射到 [0, 1]，
            // 以便将其作为颜色值使用
            // 例如：如果某点的 worldPos 是 (-1, 0.5, 1)，经过计算后变为 (0, 0.75, 1)，
            // 这样就得到了一个根据位置变化的彩色渐变效果

            // saturate(...)：将颜色值限制在 [0, 1] 区域，防止溢出
            surface.Albedo = saturate(input.worldPos * 0.5 + 0.5);

            // surface.Smoothness：设置材质的光滑度 / 反射锐利度
            // 这是一个 PBR 属性，值越高，反射越清晰（越镜面），值越低，反射越模糊
            surface.Smoothness = _Smoothness;
        }

        // ============================================
        // 结束 CG 程序块
        // ============================================
        ENDCG
    }

    // ==========================
    // FallBack（回退 Shader）
    // 如果上述 SubShader 都不能运行（比如设备太旧），则使用 Unity 内置的 "Diffuse" Shader
    // ==========================
    FallBack "Diffuse"
}